import {
  startOfWeek,
  addDays,
  format,
  subWeeks,
  eachDayOfInterval,
  formatISO,
  parseISO,
  isSameDay,
  addWeeks,
  isToday as today,
} from "date-fns";

// 获取下周一的日期
export const getNextMonday = (): string => {
  const today = new Date();
  // 1. 获取当前周的周一（以周一为周起始日）
  const currentMonday = startOfWeek(today, { weekStartsOn: 1 });
  // 2. 加上一周，得到下周一
  const nextMonday = addWeeks(currentMonday, 1);

  return format(nextMonday, "yyyy-MM-dd");
};

/**
 * 获取指定周的7天日期（YYYY-MM-DD格式），以周一为一周的第一天
 * @param baseDate 参考日期（默认当前日期）
 * @returns 7个日期字符串的数组
 */
const getWeekDates = (baseDate: Date = new Date()): string[] => {
  // 获取本周的第一天（周一），startOfWeek默认周日为第一天，这里通过weekStartsOn: 1指定周一
  const firstDayOfWeek = startOfWeek(baseDate, { weekStartsOn: 1 });

  // 生成一周7天的日期
  return Array.from({ length: 7 }, (_, i) => {
    const currentDay = addDays(firstDayOfWeek, i);
    return format(currentDay, "yyyy-MM-dd"); // 格式化为YYYY-MM-DD
  });
};

/**
 * 获取本周和上周的日期数组
 * @returns 包含本周和上周日期的对象
 */
export const getWeeksDates = () => {
  const today = new Date();

  // 本周日期（周一至周日）
  const currentWeek = getWeekDates(today);

  // 上周日期（周一至周日）：当前日期减去1周
  const lastWeek = getWeekDates(subWeeks(today, 1));

  return {
    currentWeek,
    lastWeek,
  };
};

// 使用示例
// const { currentWeek, lastWeek } = getWeeksDates();
// console.log('本周:', currentWeek); // ["2025-09-15", "2025-09-16", ..., "2025-09-21"]
// console.log('上周:', lastWeek);   // ["2025-09-08", "2025-09-09", ..., "2025-09-14"]

/**
 * 获取上周一的日期（YYYY-MM-DD）
 * @returns 上周一的日期字符串
 */
export const getLastMonday = (): string => {
  const today = new Date();
  // 1. 获取当前周的周一（以周一为周起始日）
  const currentMonday = startOfWeek(today, { weekStartsOn: 1 });
  // 2. 减去一周，得到上周一
  const lastMonday = subWeeks(currentMonday, 1);

  return format(lastMonday, "yyyy-MM-dd");
};

/**
 * 获取本周日的日期（YYYY-MM-DD）
 * @returns 本周日的日期字符串
 */
export const getCurrentSunday = (): string => {
  const today = new Date();
  // 1. 获取当前周的周一（以周一为周起始日）
  const currentMonday = startOfWeek(today, { weekStartsOn: 1 });
  // 2. 加6天得到本周日（周一+6天=周日）
  const currentSunday = addDays(currentMonday, 6);
  return format(currentSunday, "yyyy-MM-dd");
};

// 使用示例
// console.log("上周一:", getLastMonday()); // 例如："2025-09-08"
// console.log("本周日:", getCurrentSunday()); // 例如："2025-09-21"

/**
 * 补全日期数组中缺失的日期
 * @param start 开始日期（ISO格式字符串）
 * @param end 结束日期（ISO格式字符串）
 * @param dateList 现有日期数组（ISO格式字符串）
 * @returns 补全后的日期数组（ISO格式字符串）
 */
export function completeDateList(
  start: string,
  end: string,
  dateList: string[]
): string[] {
  // 解析开始和结束日期为Date对象
  const startDate = parseISO(start);
  const endDate = parseISO(end);

  // 转换现有日期列表为Date对象，方便比较
  const existingDates = dateList.map((date) => parseISO(date));

  // 生成从start到end的所有日期
  const allDatesInRange = eachDayOfInterval({
    start: startDate,
    end: endDate,
  });

  // 补全缺失的日期
  const completedDates = allDatesInRange.map((date) => {
    // 检查当前日期是否已存在于列表中
    const exists = existingDates.some((existingDate) =>
      isSameDay(date, existingDate)
    );

    // 如果存在则使用原日期字符串，否则生成新的
    if (exists) {
      return dateList.find((d) => isSameDay(parseISO(d), date))!;
    } else {
      // 生成ISO格式的日期字符串（仅日期部分，时间为00:00:00.000Z）
      return formatISO(date, { representation: "date" }) + "T00:00:00.000Z";
    }
  });

  return completedDates;
}

// 使用示例
// const start = "2025-09-08T00:00:00.000Z";
// const end = "2025-09-21T00:00:00.000Z";
// const dateList = [
//   "2025-09-10T00:00:00.000Z",
//   "2025-09-13T00:00:00.000Z",
//   "2025-09-14T00:00:00.000Z",
//   "2025-09-15T00:00:00.000Z",
//   "2025-09-17T00:00:00.000Z",
//   "2025-09-18T00:00:00.000Z",
//   "2025-09-19T00:00:00.000Z",
// ];

// const completedList = completeDateList(start, end, dateList);
// console.log(completedList);
// 输出将包含从2025-09-08到2025-09-21的所有日期

/**
 * 获取从本周一开始到下周日的所有14天日期
 * @returns 包含14个日期字符串的数组（格式：YYYY-MM-DDTHH:mm:ss.sssZ）
 */
export const getTwoWeeksDates = (): string[] => {
  const today = new Date();

  // 1. 确定本周一（以周一为周起始日）
  const currentMonday = startOfWeek(today, { weekStartsOn: 1 });

  // 3. 计算本周日（本周一加上6天）
  // const currentSunday = addDays(currentMonday, 6);

  // 2. 计算下周周日（本周一加上13天）
  const nextSunday = addDays(currentMonday, 13);

  // 4. 生成从上周一开始到本周日的所有日期
  const allDates = eachDayOfInterval({
    start: currentMonday,
    end: nextSunday,
  });

  console.log("allDates111", allDates);

  // 5. 格式化为ISO格式字符串（带时间部分）
  return allDates.map((date) => {
    // 格式化为 "YYYY-MM-DDTHH" 格式
    return formatISO(date, { representation: "date" });
    // 格式化为 "YYYY-MM-DDTHH:mm:ss.sssZ" 格式
    // return formatISO(date, { representation: "date" }) + "T00:00:00.000Z";
  });
};

// 使用示例
// const twoWeeksDates = getTwoWeeksDates();
// console.log("使用示例", twoWeeksDates);
// 输出示例（共14天）：
// [
//   "2025-09-08T00:00:00.000Z",
//   "2025-09-09T00:00:00.000Z",
//   ...,
//   "2025-09-21T00:00:00.000Z"
// ]

/**
 * 检查日期是否为今天
 * @param date 日期字符串（格式：YYYY-MM-DDTHH:mm:ss.sssZ）
 * @returns 如果是今天则返回true，否则返回false
 */
export const isToday = (date: string): boolean => {
  return today(new Date(date));
};
